package com.snowRemovingUser.service.impl;

import com.ruoyi.common.core.domain.AjaxResult;
import com.snowRemovingUser.domain.MDevice;
import com.snowRemovingUser.domain.MDeviceAttribute;
import com.snowRemovingUser.mapper.MDeviceAttributeMapper;
import com.snowRemovingUser.mapper.MDeviceAttributeSlaveMapper;
import com.snowRemovingUser.mapper.MDeviceMapper;
import com.snowRemovingUser.service.IMDeviceAttributeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * 设备属性Service业务层处理
 *
 * @author liguang
 * @date 2023-05-14
 */
@Service
public class MDeviceAttributeServiceImpl implements IMDeviceAttributeService
{
    @Autowired
    private MDeviceAttributeMapper mDeviceAttributeMapper;

    @Autowired
    private MDeviceAttributeSlaveMapper mDeviceAttributeSlaveMapper;

    @Autowired
    private MDeviceMapper deviceMapper;

    /**
     * 查询设备属性
     *
     * @param serialNumber 设备属性主键
     * @return 设备属性
     */
    @Override
    public MDeviceAttribute selectMDeviceAttributeBySerialNumber(String serialNumber)
    {
        return mDeviceAttributeMapper.selectMDeviceAttributeBySerialNumber(serialNumber);
    }

    /**
     * 查询设备属性列表
     *
     * @param mDeviceAttribute 设备属性
     * @return 设备属性
     */
    @Override
    public List<MDeviceAttribute> selectMDeviceAttributeList(MDeviceAttribute mDeviceAttribute)
    {
        return mDeviceAttributeMapper.selectMDeviceAttributeList(mDeviceAttribute);
    }

    /**
     * 新增设备属性
     *
     * @param mDeviceAttribute 设备属性
     * @return 结果
     */
    @Override
    public int insertMDeviceAttribute(MDeviceAttribute mDeviceAttribute)
    {
        return mDeviceAttributeMapper.insertMDeviceAttribute(mDeviceAttribute);
    }

    /**
     * 修改设备属性
     *
     * @param mDeviceAttribute 设备属性
     * @return 结果
     */
    @Override
    public int updateMDeviceAttribute(MDeviceAttribute mDeviceAttribute)
    {
        return mDeviceAttributeMapper.updateMDeviceAttribute(mDeviceAttribute);
    }

    /**
     * 批量删除设备属性
     *
     * @param serialNumbers 需要删除的设备属性主键
     * @return 结果
     */
    @Override
    public int deleteMDeviceAttributeBySerialNumbers(String[] serialNumbers)
    {
        return mDeviceAttributeMapper.deleteMDeviceAttributeBySerialNumbers(serialNumbers);
    }

    /**
     * 删除设备属性信息
     *
     * @param serialNumber 设备属性主键
     * @return 结果
     */
    @Override
    public int deleteMDeviceAttributeBySerialNumber(String serialNumber)
    {
        return mDeviceAttributeMapper.deleteMDeviceAttributeBySerialNumber(serialNumber);
    }


    /**
     * 启用设备属性
     * @param deviceAttribute
     * @return
     */
    @Override
    public AjaxResult handleAttributeEnable(MDeviceAttribute deviceAttribute) {

        //查询设备是否已经启用
        MDeviceAttribute mDeviceAttribute = mDeviceAttributeMapper.selectMDeviceAttributeBySerialNumberAndAttributeId(deviceAttribute.getSerialNumber(), deviceAttribute.getAttributeId());

        if (mDeviceAttribute.getAttributeStatus()==0){

            throw new RuntimeException(mDeviceAttribute.getAttributeName()+"已经启用请勿重复启用");
        }

        //设备未启用就改为启用
        mDeviceAttribute.setAttributeStatus(0);
        mDeviceAttribute.setAttributeDate(new Date());
        mDeviceAttributeMapper.updateMDeviceAttributeBySerialNumberAndAttributeId(mDeviceAttribute);
        //同步更新从数据库
        mDeviceAttributeSlaveMapper.updateMDeviceAttributeBySerialNumberAndAttributeId(mDeviceAttribute);
        //更新总状态
        handleOverallStatus(deviceAttribute);
        return AjaxResult.success();
    }


    /**
     * 停用设备属性
     * @param deviceAttribute
     * @return
     */
    @Override
    public AjaxResult handleAttributeDisable(MDeviceAttribute deviceAttribute) {
        //查询设备是否已经停用
        MDeviceAttribute mDeviceAttribute = mDeviceAttributeMapper.selectMDeviceAttributeBySerialNumberAndAttributeId(deviceAttribute.getSerialNumber(), deviceAttribute.getAttributeId());

        if (mDeviceAttribute.getAttributeStatus()==2){

            throw new RuntimeException(mDeviceAttribute.getAttributeName()+"已经停用请勿重复停用");
        }

        //设备未停用就改为停用
        mDeviceAttribute.setAttributeStatus(2);
        mDeviceAttribute.setAttributeDate(new Date());
        mDeviceAttributeMapper.updateMDeviceAttributeBySerialNumberAndAttributeId(mDeviceAttribute);
        //同步更新从数据库
        mDeviceAttributeSlaveMapper.updateMDeviceAttributeBySerialNumberAndAttributeId(mDeviceAttribute);
        //更新总状态
        handleOverallStatus(deviceAttribute);
        return AjaxResult.success();
    }


    /**
     * 更新总状态
     */
    private void handleOverallStatus(MDeviceAttribute deviceAttribute){

        MDeviceAttribute mDeviceAttribute1 = new MDeviceAttribute();
        mDeviceAttribute1.setSerialNumber(deviceAttribute.getSerialNumber());
        List<MDeviceAttribute> mDeviceAttributes = mDeviceAttributeMapper.selectMDeviceAttributeList(mDeviceAttribute1);



        MDevice mDevice = deviceMapper.selectMDeviceBySerialNumber(deviceAttribute.getSerialNumber());

        Boolean AttributeState = true;

        for (MDeviceAttribute mDeviceAttribute : mDeviceAttributes) {

            if (mDeviceAttribute.getAttributeStatus()==1){

                mDevice.setOverallStatus(1);
                deviceMapper.updateMDevice(mDevice);
                AttributeState =false;
                break;
            }else if (mDeviceAttribute.getAttributeStatus()==2 && mDevice.getOverallStatus()!=1){

                mDevice.setOverallStatus(2);
                deviceMapper.updateMDevice(mDevice);
                AttributeState =false;
                break;

            }

        }

        if (AttributeState){

            mDevice.setOverallStatus(0);
            deviceMapper.updateMDevice(mDevice);

        }





    }
}
